2025/1/14 2025/2/1 2 min read
BLE Bondigメモ
主にSoftDevice。
#ボンディング時に渡される情報
master_id = {
ediv: u16,
rand: [u8; 8],
}
enc = {
ltk: [u8; 16],
flags: u8,
}
peer_id = {
irk: [u8; 16],
addr: {
flags: u8,
bytes: [u8; 6],
}
}
-
master_id: 暗号化情報を識別するための情報ediv: 後に出てくるLTKが変わると変わるrand: これもLTKが変わると変わるが、edivがクライアントの内部でLTKへのKeyとして扱われているのに対してrandはその名の通り適当なランダムの値だと思われる 参照: https://stackoverflow.com/questions/48165520/need-details-about-ediv-and-rand
-
enc: ボンディングで保存されるべき暗号化情報ltk: Long Term Key。これがメインで用いられる暗号化のためのキーである。flags: 要調査。ボンディングすべきかなどのフラグを含んでいるらしい…?
つまり、Map<(ediv, rand), ltk>のような構造となっていることがわかる。再接続する再には送られてきたmaster_idを用いてltkをストレージなどから読み出し、その値を暗号化に用いる。
peer_id: クライアントを識別するための情報。暗号化とは違うaddr: いわゆるBluetoothのアドレスであるが、プライバシーのためにこのアドレスは接続の度に変化することが普通である。ではどうやってクライアイントを識別するのか。これが次のirkである。irk: Rustのnrf-softdeviceでは実際はこの値はprivateな値になっており、peer_idが同じものか判定するメソッドのみが提供されている。